home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume24 / gnucalc / part53 < prev    next >
Encoding:
Text File  |  1991-11-02  |  55.4 KB  |  1,344 lines

  1. Newsgroups: comp.sources.misc
  2. From: daveg@synaptics.com (David Gillespie)
  3. Subject:  v24i101:  gnucalc - GNU Emacs Calculator, v2.00, Part53/56
  4. Message-ID: <1991Nov3.001121.19934@sparky.imd.sterling.com>
  5. X-Md4-Signature: 42d6fbdd570052add95bd12c0e6a560c
  6. Date: Sun, 3 Nov 1991 00:11:21 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: daveg@synaptics.com (David Gillespie)
  10. Posting-number: Volume 24, Issue 101
  11. Archive-name: gnucalc/part53
  12. Environment: Emacs
  13. Supersedes: gmcalc: Volume 13, Issue 27-45
  14.  
  15. #!/bin/sh
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file calc.texinfo continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 53; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test ! -f _shar_wnt_.tmp; then
  32.     echo 'x - still skipping calc.texinfo'
  33. else
  34. echo 'x - continuing file calc.texinfo'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'calc.texinfo' &&
  36. @samp{(calc-eval "1+2,3+4" ";")} returns @samp{"3;7"}.
  37. X
  38. The ``separator'' can also be any of several Lisp symbols which
  39. request other behaviors from @code{calc-eval}.  These are discussed
  40. one by one below.
  41. X
  42. You can give additional arguments to be substituted for
  43. @samp{$}, @samp{$$}, and so on in the main expression.  For
  44. example, @samp{(calc-eval "$/$$" nil "7" "1+1")} evaluates the
  45. expression @samp{"7/(1+1)"} to yield the result @samp{"3.5"}
  46. (assuming Fraction mode is not in effect).  Note the @code{nil}
  47. used as a placeholder for the item-separator argument.
  48. X
  49. @ifinfo
  50. @example
  51. X
  52. @end example
  53. @end ifinfo
  54. @subsubsection Numbers Only
  55. X
  56. @noindent
  57. Sometimes it is preferable to treat @samp{1 / 0} as an error
  58. rather than returning a symbolic result.  If you pass the symbol
  59. @code{num} as the second argument to @code{calc-eval}, results
  60. that are not constants are treated as errors.  The error message
  61. reported is the first @samp{calc-why} message if there is one,
  62. or otherwise ``Number expected.''
  63. X
  64. A result is ``constant'' if it is a number, vector, or other
  65. object that does not include variables or function calls.  If it
  66. is a vector, the components must themselves be constants.
  67. X
  68. @ifinfo
  69. @example
  70. X
  71. @end example
  72. @end ifinfo
  73. @subsubsection Error Handling
  74. X
  75. @noindent
  76. If @code{calc-eval} encounters an error, it returns a list containing
  77. the character position of the error, plus a suitable message as a
  78. string.  Note that @samp{1 / 0} is @emph{not} an error by Calc's
  79. standards; it simply returns the string @samp{"1 / 0"} which is the
  80. division left in symbolic form.  But @samp{(calc-eval "1/")} will
  81. return the list @samp{(2 "Expected a number")}.
  82. X
  83. If you bind the variable @code{calc-eval-error} to @code{t}
  84. using a @code{let} form surrounding the call to @code{calc-eval},
  85. errors instead call the Emacs @code{error} function which aborts
  86. to the Emacs command loop with a beep and an error message.
  87. X
  88. If you bind this variable to the symbol @code{string}, error messages
  89. are returned as strings instead of lists.  The character position is
  90. ignored.
  91. X
  92. As a courtesy to other Lisp code which may be using Calc, be sure
  93. to bind @code{calc-eval-error} using @code{let} rather than changing
  94. it permanently with @code{setq}.
  95. X
  96. @ifinfo
  97. @example
  98. X
  99. @end example
  100. @end ifinfo
  101. @subsubsection Default Modes
  102. X
  103. @noindent
  104. If the first argument to @code{calc-eval} is a list whose first
  105. element is a formula string, then @code{calc-eval} sets all the
  106. various Calc modes to their default values while the formula is
  107. evaluated and formatted.  For example, the precision is set to 12
  108. digits, digit grouping is turned off, and the normal language
  109. mode is used.
  110. X
  111. This same principle applies to the other options discussed below.
  112. If the first argument would normally be @var{x}, then it can also
  113. be the list @samp{(@var{x})} to use the default mode settings.
  114. X
  115. If there are other elements in the list, they are taken as
  116. variable-name/value pairs which override the default mode
  117. settings.  Look at the documentation at the front of the
  118. @file{calc.el} file to find the names of the Lisp variables for
  119. the various modes.  The mode settings are restored to their
  120. original values when @code{calc-eval} is done.
  121. X
  122. For example, @samp{(calc-eval '("$+$$" calc-internal-prec 8) 'num a b)}
  123. computes the sum of two numbers, requiring a numeric result, and
  124. using default mode settings except that the precision is 8 instead
  125. of the default of 12.
  126. X
  127. It's usually best to use this form of @code{calc-eval} unless your
  128. program actually considers the interaction with Calc's mode settings
  129. to be a feature.  This will avoid all sorts of potential ``gotchas'';
  130. consider what happens with @samp{(calc-eval "sqrt(2)" 'num)}
  131. when the user has left Calc in symbolic mode or no-simplify mode.
  132. X
  133. As another example, @samp{(equal (calc-eval '("$<$$") nil a b) "1")}
  134. checks if the number in string @cite{a} is less than the one in
  135. string @cite{b}.  Without using a list, the integer 1 might
  136. come out in a variety of formats which would be hard to test for
  137. conveniently: @samp{"1"}, @samp{"8#1"}, @samp{"00001"}.  (But
  138. see ``Predicates'' mode, below.)
  139. X
  140. @ifinfo
  141. @example
  142. X
  143. @end example
  144. @end ifinfo
  145. @subsubsection Raw Numbers
  146. X
  147. @noindent
  148. Normally all input and output for @code{calc-eval} is done with strings.
  149. You can do arithmetic with, say, @samp{(calc-eval "$+$$" nil a b)}
  150. in place of @samp{(+ a b)}, but this is very inefficient since the
  151. numbers must be converted to and from string format as they are passed
  152. from one @code{calc-eval} to the next.
  153. X
  154. If the separator is the symbol @code{raw}, the result will be returned
  155. as a raw Calc data structure rather than a string.  You can read about
  156. how these objects look in the following sections, but usually you can
  157. treat them as ``black box'' objects with no important internal
  158. structure.
  159. X
  160. There is also a @code{rawnum} symbol, which is a combination of
  161. @code{raw} (returning a raw Calc object) and @code{num} (signalling
  162. an error if that object is not a constant).
  163. X
  164. You can pass a raw Calc object to @code{calc-eval} in place of a
  165. string, either as the formula itself or as one of the @samp{$}
  166. arguments.  Thus @samp{(calc-eval "$+$$" 'raw a b)} is an
  167. addition function that operates on raw Calc objects.  Of course
  168. in this case it would be easier to call the low-level @code{math-add}
  169. function in Calc, if you can remember its name.
  170. X
  171. In particular, note that a plain Lisp integer is acceptable to Calc
  172. as a raw object.  (All Lisp integers are accepted on input, but
  173. integers of more than six decimal digits are converted to ``big-integer''
  174. form for output.  @xref{Data Type Formats}.)
  175. X
  176. When it comes time to display the object, just use @samp{(calc-eval a)}
  177. to format it as a string.
  178. X
  179. It is an error if the input expression evaluates to a list of
  180. values.  The separator symbol @code{list} is like @code{raw}
  181. except that it returns a list of one or more raw Calc objects.
  182. X
  183. Note that a Lisp string is not a valid Calc object, nor is a list
  184. containing a string.  Thus you can still safely distinguish all the
  185. various kinds of error returns discussed above.
  186. X
  187. @ifinfo
  188. @example
  189. X
  190. @end example
  191. @end ifinfo
  192. @subsubsection Predicates
  193. X
  194. @noindent
  195. If the separator symbol is @code{pred}, the result of the formula is
  196. treated as a true/false value; @code{calc-eval} returns @code{t} or
  197. @code{nil}, respectively.  A value is considered ``true'' if it is a
  198. non-zero number, or false if it is zero or if it is not a number.
  199. X
  200. For example, @samp{(calc-eval "$<$$" 'pred a b)} tests whether
  201. one value is less than another.
  202. X
  203. As usual, it is also possible for @code{calc-eval} to return one of
  204. the error indicators described above.  Lisp will interpret such an
  205. indicator as ``true'' if you don't check for it explicitly.  If you
  206. wish to have an error register as ``false'', use something like
  207. @samp{(eq (calc-eval ...) t)}.
  208. X
  209. @ifinfo
  210. @example
  211. X
  212. @end example
  213. @end ifinfo
  214. @subsubsection Variable Values
  215. X
  216. @noindent
  217. Variables in the formula passed to @code{calc-eval} are not normally
  218. replaced by their values.  If you wish this, you can use the
  219. @code{evalv} function (@pxref{Algebraic Manipulation}).  For example,
  220. if 4 is stored in Calc variable @code{a} (i.e., in Lisp variable
  221. @code{var-a}), then @samp{(calc-eval "a+pi")} will return the
  222. formula @samp{"a + pi"}, but @samp{(calc-eval "evalv(a+pi)")}
  223. will return @samp{"7.14159265359"}.
  224. X
  225. To store in a Calc variable, just use @code{setq} to store in the
  226. corresponding Lisp variable.  (This is obtained by prepending
  227. @samp{var-} to the Calc variable name.)  Calc routines will
  228. understand either string or raw form values stored in variables,
  229. although raw data objects are much more efficient.  For example,
  230. to increment the Calc variable @code{a}:
  231. X
  232. @example
  233. (setq var-a (calc-eval "evalv(a+1)" 'raw))
  234. @end example
  235. X
  236. @ifinfo
  237. @example
  238. X
  239. @end example
  240. @end ifinfo
  241. @subsubsection Stack Access
  242. X
  243. @noindent
  244. If the separator symbol is @code{push}, the formula argument is
  245. evaluated (with possible @samp{$} expansions, as usual).  The
  246. result is pushed onto the Calc stack.  The return value is @code{nil}
  247. (unless there is an error from evaluating the formula).
  248. X
  249. If the separator symbol is @code{pop}, the first argument to
  250. @code{calc-eval} must be an integer instead of a string.  That
  251. many values are popped from the stack and thrown away.  A negative
  252. argument deletes the entry at that stack level.  The return value
  253. is the number of elements remaining in the stack after popping;
  254. @samp{(calc-eval 0 'pop)} is a good way to measure the size of
  255. the stack.
  256. X
  257. If the separator symbol is @code{top}, the first argument to
  258. @code{calc-eval} must again be an integer.  The value at that
  259. stack level is formatted as a string and returned.  Thus
  260. @samp{(calc-eval 1 'top)} returns the top-of-stack value.  If the
  261. integer is out of range, @code{nil} is returned.
  262. X
  263. The separator symbol @code{rawtop} is just like @code{top} except
  264. that the stack entry is returned as a raw Calc object instead of
  265. as a string.
  266. X
  267. In all of these cases the first argument can be made a list in
  268. order to force the default mode settings, as described above.
  269. Thus @samp{(calc-eval '(2 calc-number-radix 16) 'top)} returns the
  270. second-to-top stack entry, formatted as a string using the default
  271. instead of current display modes, except that the radix is
  272. hexadecimal instead of decimal.
  273. X
  274. It is, of course, polite to put the Calc stack back the way you
  275. found it when you are done, unless the user of your program is
  276. actually expecting it to affect the stack.
  277. X
  278. Note that you do not actually have to switch into the @samp{*Calculator*}
  279. buffer in order to use @code{calc-eval}; it temporarily switches into
  280. the stack buffer if necessary.
  281. X
  282. @ifinfo
  283. @example
  284. X
  285. @end example
  286. @end ifinfo
  287. @subsubsection Keyboard Macros
  288. X
  289. @noindent
  290. If the separator symbol is @code{macro}, the first argument must be a
  291. string of characters which Calc can execute as a sequence of keystrokes.
  292. This switches into the Calc buffer for the duration of the macro.
  293. For example, @samp{(calc-eval "vx5\rVR+" 'macro)} pushes the
  294. vector @samp{[1,2,3,4,5]} on the stack and then replaces it
  295. with the sum of those numbers.  Note that @samp{\r} is the Lisp
  296. notation for the carriage-return, @key{RET}, character.
  297. X
  298. If your keyboard macro wishes to pop the stack, @samp{\C-d} is
  299. safer than @samp{\177} (the @key{DEL} character) because some
  300. installations may have switched the meanings of @key{DEL} and
  301. @kbd{C-h}.  Calc always interprets @kbd{C-d} as a synonym for
  302. ``pop-stack'' regardless of key mapping.
  303. X
  304. If you provide a third argument to @code{calc-eval}, evaluation
  305. of the keyboard macro will leave a record in the Trail using
  306. that argument as a tag string.  Normally the Trail is unaffected.
  307. X
  308. The return value in this case is always @code{nil}.
  309. X
  310. @ifinfo
  311. @example
  312. X
  313. @end example
  314. @end ifinfo
  315. @subsubsection Lisp Evaluation
  316. X
  317. @noindent
  318. Finally, if the separator symbol is @code{eval}, then the Lisp
  319. @code{eval} function is called on the first argument, which must
  320. be a Lisp expression rather than a Calc formula.  Remember to
  321. quote the expression so that it is not evaluated until inside
  322. @code{calc-eval}.
  323. X
  324. The difference from plain @code{eval} is that @code{calc-eval}
  325. switches to the Calc buffer before evaluating the expression.
  326. For example, @samp{(calc-eval '(setq calc-internal-prec 17) 'eval)}
  327. will correctly affect the buffer-local Calc precision variable.
  328. X
  329. An alternative would be @samp{(calc-eval '(calc-precision 17) 'eval)}.
  330. This is evaluating a call to the function that is normally invoked
  331. by the @kbd{p} key, giving it 17 as its ``numeric prefix argument.''
  332. Note that this function will leave a message in the echo area as
  333. a side effect.  Also, all Calc functions switch to the Calc buffer
  334. automatically if not invoked from there, so the above call is
  335. also equivalent to @samp{(calc-precision 17)} by itself.
  336. In all cases, Calc uses @code{save-excursion} to switch back to
  337. your original buffer when it is done.
  338. X
  339. As usual the first argument can be a list that begins with a Lisp
  340. expression to use default instead of current mode settings.
  341. X
  342. The result of @code{calc-eval} in this usage is just the result
  343. returned by the evaluated Lisp expression.
  344. X
  345. @ifinfo
  346. @example
  347. X
  348. @end example
  349. @end ifinfo
  350. @subsubsection Example
  351. X
  352. @noindent
  353. @findex convert-temp
  354. Here is a sample Emacs command that uses @code{calc-eval}.  Suppose
  355. you have a document with lots of references to temperatures on the
  356. Fahrenheit scale, say ``98.6 F'', and you wish to convert these
  357. references to Centigrade.  The following command does this conversion.
  358. Place the Emacs cursor right after the letter ``F'' and invoke the
  359. command to change ``98.6 F'' to ``37 C''.  Or, if the temperature is
  360. already in Centigrade form, the command changes it back to Fahrenheit.
  361. X
  362. @example
  363. (defun convert-temp ()
  364. X  (interactive)
  365. X  (save-excursion
  366. X    (re-search-backward "[^-.0-9]\\([-.0-9]+\\) *\\([FC]\\)")
  367. X    (let* ((top1 (match-beginning 1))
  368. X           (bot1 (match-end 1))
  369. X           (number (buffer-substring top1 bot1))
  370. X           (top2 (match-beginning 2))
  371. X           (bot2 (match-end 2))
  372. X           (type (buffer-substring top2 bot2)))
  373. X      (if (equal type "F")
  374. X          (setq type "C"
  375. X                number (calc-eval "($ - 32)*5/9" nil number))
  376. X        (setq type "F"
  377. X              number (calc-eval "$*9/5 + 32" nil number)))
  378. X      (goto-char top2)
  379. X      (delete-region top2 bot2)
  380. X      (insert-before-markers type)
  381. X      (goto-char top1)
  382. X      (delete-region top1 bot1)
  383. X      (if (string-match "\\.$" number)   ; change "37." to "37"
  384. X          (setq number (substring number 0 -1)))
  385. X      (insert number))))
  386. @end example
  387. X
  388. Note the use of @code{insert-before-markers} when changing between
  389. ``F'' and ``C'', so that the character winds up before the cursor
  390. instead of after it.
  391. X
  392. @node Internals, , Calling Calc from Your Programs, Lisp Definitions
  393. @subsection Calculator Internals
  394. X
  395. @noindent
  396. This section describes the Lisp functions defined by the Calculator that
  397. may be of use to user-written Calculator programs (as described in the
  398. rest of this chapter).  These functions are shown by their names as they
  399. conventionally appear in @code{defmath}.  Their full Lisp names are
  400. generally gotten by prepending @samp{calcFunc-} or @samp{math-} to their
  401. apparent names.  (Names that begin with @samp{calc-} are already in
  402. their full Lisp form.)  You can use the actual full names instead if you
  403. prefer them, or if you are calling these functions from regular Lisp.
  404. X
  405. Little distinction is made here between functions in the main Calc body
  406. and functions in the extensions module (@file{calc-ext.el}).  Because
  407. @code{defmath} itself uses the extensions, user-written code generally
  408. always executes with the extensions already loaded, so this is not an
  409. issue.  If you are doing something special, check carefully to make sure
  410. each function you are using is from the main body, and call
  411. @samp{(calc-extensions)} before using any function from the extensions
  412. package if you can't prove the extensions will already have been loaded.
  413. X
  414. @menu
  415. * Data Type Formats::
  416. * Interactive Lisp Functions::
  417. * Stack Lisp Functions::
  418. * Predicates::
  419. * Computational Lisp Functions::
  420. * Vector Lisp Functions::
  421. * Symbolic Lisp Functions::
  422. * Formatting Lisp Functions::
  423. * Lisp Variables::
  424. * Hooks::
  425. @end menu
  426. X
  427. @node Data Type Formats, Interactive Lisp Functions, Internals, Internals
  428. @subsubsection Data Type Formats
  429. X
  430. @noindent
  431. Integers are stored in either of two ways, depending on their magnitude.
  432. Integers less than one million in absolute value are stored as standard
  433. Lisp integers.  This is the only storage format for Calc data objects
  434. which is not a Lisp list.
  435. X
  436. Large integers are stored as a list of the form @samp{(bigpos @var{d0}
  437. @var{d1} @var{d2} @dots{})} for positive integers 1000000 or more, or
  438. @samp{(bigneg @var{d0} @var{d1} @var{d2} @dots{})} for negative integers
  439. -1000000 or less.  Each @var{d} is a base-1000 ``digit,'' a Lisp integer
  440. from 0 to 999.  The least significant digit is @var{d0}; the last digit,
  441. @var{dn}, which is always nonzero, is the most significant digit.  For
  442. example, the integer @i{-12345678} is stored as @samp{(bigneg 678 345 12)}.
  443. X
  444. The distinction between small and large integers is entirely hidden from
  445. the user.  In @code{defmath} definitions, the Lisp predicate @code{integerp}
  446. returns true for either kind of integer, and in general both big and small
  447. integers are accepted anywhere the word ``integer'' is used in this manual.
  448. If the distinction must be made, native Lisp integers are called @dfn{fixnums}
  449. and large integers are called @dfn{bignums}.
  450. X
  451. Fractions are stored as a list of the form, @samp{(frac @var{n} @var{d})}
  452. where @var{n} is an integer (big or small) numerator, @var{d} is an
  453. integer denominator greater than one, and @var{n} and @var{d} are relatively
  454. prime.  Note that fractions where @var{d} is one are automatically converted
  455. to plain integers by all math routines; fractions where @var{d} is negative
  456. are normalized by negating the numerator and denominator.
  457. X
  458. Floating-point numbers are stored in the form, @samp{(float @var{mant}
  459. @var{exp})}, where @var{mant} (the ``mantissa'') is an integer less than
  460. @samp{10^@var{p}} in absolute value (@var{p} represents the current
  461. precision), and @var{exp} (the ``exponent'') is a fixnum.  The value of
  462. the float is @samp{@var{mant} * 10^@var{exp}}.  For example, the number
  463. -3.14 is stored as @samp{(float -314 -2) = -314*10^-2}.  Other constraints
  464. are that the number 0.0 is always stored as @samp{(float 0 0)}, and,
  465. except for the 0.0 case, the rightmost base-10 digit of @var{mant} is
  466. always nonzero.  (If the rightmost digit is zero, the number is
  467. rearranged by dividing @var{mant} by ten and incrementing @var{exp}.)@refill
  468. X
  469. Rectangular complex numbers are stored in the form @samp{(cplx @var{re}
  470. @var{im})}, where @var{re} and @var{im} are each real numbers, either
  471. integers, fractions, or floats.  The value is @samp{@var{re} + @var{im}i}.
  472. The @var{im} part is nonzero; complex numbers with zero imaginary
  473. components are converted to real numbers automatically.@refill
  474. X
  475. Polar complex numbers are stored in the form @samp{(polar @var{r}
  476. @var{theta})}, where @var{r} is a positive real value and @var{theta}
  477. is a real value or HMS form representing an angle.  This angle is
  478. usually normalized to lie in the interval @samp{(-180 ..@: 180)} degrees,
  479. or @samp{(-pi ..@: pi)} radians, according to the current angular mode.
  480. If the angle is 0 the value is converted to a real number automatically.
  481. (If the angle is 180 degrees, the value is usually also converted to a
  482. negative real number.)@refill
  483. X
  484. Hours-minutes-seconds forms are stored as @samp{(hms @var{h} @var{m}
  485. @var{s})}, where @var{h} is an integer or an integer-valued float (i.e.,
  486. a float with @samp{@var{exp} >= 0}), @var{m} is an integer or integer-valued
  487. float in the range @samp{[0 ..@: 60)}, and @var{s} is any real number in the
  488. range @samp{[0 ..@: 60)}.@refill
  489. X
  490. Date forms are stored as @samp{(date @var{n})}, where @var{n} is
  491. a real number that counts days since midnight on the morning of
  492. January 1, 1 AD.  If @var{n} is an integer, this is a pure date
  493. form.  If @var{n} is a fraction or float, this is a date/time form.
  494. X
  495. Modulo forms are stored as @samp{(mod @var{n} @var{m})}, where @var{m} is a
  496. positive real number or HMS form, and @var{n} is a real number or HMS
  497. form in the range @samp{[0 ..@: @var{m})}.
  498. X
  499. Error forms are stored as @samp{(sdev @var{x} @var{sigma})}, where @var{x}
  500. is the mean value and @var{sigma} is the standard deviation.  Each
  501. component is either a number, an HMS form, or a symbolic object
  502. (a variable or function call).  If @var{sigma} is zero, the value is
  503. converted to a plain real number.  If @var{sigma} is negative or
  504. complex, it is automatically normalized to be a positive real.
  505. X
  506. Interval forms are stored as @samp{(intv @var{mask} @var{lo} @var{hi})},
  507. where @var{mask} is one of the integers 0, 1, 2, or 3, and @var{lo} and
  508. @var{hi} are real numbers, HMS forms, or symbolic objects.  The @var{mask}
  509. is a binary integer where 1 represents the fact that the interval is
  510. closed on the high end, and 2 represents the fact that it is closed on
  511. the low end.  (Thus 3 represents a fully closed interval.)  The interval
  512. @samp{(intv 3 @var{x} @var{x})} is converted to the plain number @var{x};
  513. intervals @samp{(intv @var{mask} @var{x} @var{x})} for any other @var{mask}
  514. represent empty intervals.  If @var{hi} is less than @var{lo}, the interval
  515. is converted to a standard empty interval by replacing @var{hi} with @var{lo}.
  516. X
  517. Vectors are stored as @samp{(vec @var{v1} @var{v2} @dots{})}, where @var{v1}
  518. is the first element of the vector, @var{v2} is the second, and so on.
  519. An empty vector is stored as @samp{(vec)}.  A matrix is simply a vector
  520. where all @var{v}'s are themselves vectors of equal lengths.
  521. X
  522. Variables are stored as @samp{(var @var{name} @var{sym})}, where
  523. @var{name} is a Lisp symbol whose print name is used as the visible name
  524. of the variable, and @var{sym} is a Lisp symbol in which the variable's
  525. value is actually stored.  Thus, @samp{(var pi var-pi)} represents the
  526. special constant @samp{pi}.  Almost always, the form is @samp{(var
  527. @var{v} var-@var{v})}.  If the variable name was entered with @code{#}
  528. signs (which are converted to hyphens internally), the form is
  529. @samp{(var @var{v} @var{v})}.  The value of a variable is the Calc
  530. object stored in its @var{sym} symbol's value cell.  If the symbol's
  531. value cell is void or if it contains @code{nil}, the variable has no
  532. value.  Special constants have the form @samp{(special-const
  533. @var{value})} stored in their value cell, where @var{value} is a formula
  534. which is evaluated when the constant's value is requested.  Variables
  535. which represent units are not stored in any special way; they are units
  536. only because their names appear in the units table.  If the value
  537. cell contains a string, it is parsed to get the variable's value when
  538. the variable is used.@refill
  539. X
  540. A Lisp list with any other symbol as the first element is a function call.
  541. The symbols @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^},
  542. and @code{|} represent special binary operators; these lists are always
  543. of the form @samp{(@var{op} @var{lhs} @var{rhs})} where @var{lhs} is the
  544. sub-formula on the lefthand side and @var{rhs} is the sub-formula on the
  545. right.  The symbol @code{neg} represents unary negation; this list is always
  546. of the form @samp{(neg @var{arg})}.  Any other symbol @var{func} represents a
  547. function that would be displayed in function-call notation; the symbol
  548. @var{func} is in general always of the form @samp{calcFunc-@var{name}}.
  549. The function cell of the symbol @var{func} should contain a Lisp function
  550. for evaluating a call to @var{func}.  This function is passed the remaining
  551. elements of the list (themselves already evaluated) as arguments; such
  552. functions should return @code{nil} or call @code{reject-arg} to signify
  553. that they should be left in symbolic form, or they should return a Calc
  554. object which represents their value, or a list of such objects if they
  555. wish to return multiple values.  (The latter case is allowed only for
  556. functions which are the outer-level call in an expression whose value is
  557. about to be pushed on the stack.)@refill
  558. X
  559. @node Interactive Lisp Functions, Stack Lisp Functions, Data Type Formats, Internals
  560. @subsubsection Interactive Functions
  561. X
  562. @noindent
  563. The functions described here are used in implementing interactive Calc
  564. commands.
  565. X
  566. @defun calc-set-command-flag flag
  567. Set the command flag @var{flag}.  This is generally a Lisp symbol, but
  568. may in fact by anything.  The effect is to add @var{flag} to the list
  569. stored in the variable @code{calc-command-flags}, unless it is already
  570. there.  @xref{Defining Simple Commands}.
  571. @end defun
  572. X
  573. @defun calc-clear-command-flag flag
  574. If @var{flag} appears among the list of currently-set command flags,
  575. remove it from that list.
  576. @end defun
  577. X
  578. @defun calc-record-undo rec
  579. Add the ``undo record'' @var{rec} to the list of steps to take if the
  580. current operation should need to be undone.  Stack push and pop functions
  581. automatically call @code{calc-record-undo}, so the kinds of undo records
  582. you might need to create take the form @samp{(set @var{sym} @var{value})},
  583. which says that the Lisp variable @var{sym} was changed and had previously
  584. contained @var{value}; @samp{(store @var{var} @var{value})} which says that
  585. the Calc variable @var{var} (a string which is the name of the symbol that
  586. contains the variable's value) was stored and its previous value was
  587. @var{value} (either a Calc data object, or @var{nil} if the variable was
  588. previously void); or @samp{(eval @var{undo} @var{redo} @var{args} @dots{})},
  589. which means that to undo requires calling the function @samp{(@var{undo}
  590. @var{args} @dots{})} and, if the undo is later redone, calling
  591. @samp{(@var{redo} @var{args} @dots{})}.@refill
  592. @end defun
  593. X
  594. @defun calc-record-why msg args
  595. Record the error or warning message @var{msg}, which is normally a string.
  596. This message will be replayed if the user types @kbd{w} (@code{calc-why});
  597. the first such message recorded for a command will be replayed automatically
  598. if the user has turned on @code{calc-auto-why} mode.  If one or more
  599. @var{args} are present, the displayed message will be of the form,
  600. @samp{@var{msg}: @var{arg1}, @var{arg2}, @dots{}}, where the arguments are
  601. formatted on the assumption that they are either strings or Calc objects of
  602. some sort.  If @var{msg} is a symbol, it is the name of a Calc predicate
  603. (such as @code{integerp} or @code{numvecp}) which the arguments did not
  604. satisfy; it is expanded to a suitable string such as ``Expected an
  605. integer.''  The @code{reject-arg} function calls @code{calc-record-why}
  606. automatically; @pxref{Predicates}.@refill
  607. @end defun
  608. X
  609. @defun calc-is-inverse
  610. This predicate returns true if the current command is inverse,
  611. i.e., if the Inverse (@kbd{I} key) flag was set.
  612. @end defun
  613. X
  614. @defun calc-is-hyperbolic
  615. This predicate is the analogous function for the @kbd{H} key.
  616. @end defun
  617. X
  618. @node Stack Lisp Functions, Predicates, Interactive Lisp Functions, Internals
  619. @subsubsection Stack-Oriented Functions
  620. X
  621. @noindent
  622. The functions described here perform various operations on the Calc
  623. stack and trail.  They are to be used in interactive Calc commands.
  624. X
  625. @defun calc-push-list vals n
  626. Push the Calc objects in list @var{vals} onto the stack at stack level
  627. @var{n}.  If @var{n} is omitted it defaults to 1, so that the elements
  628. are pushed at the top of the stack.  If @var{n} is greater than 1, the
  629. elements will be inserted into the stack so that the last element will
  630. end up at level @var{n}, the next-to-last at level @var{n}+1, etc.
  631. The elements of @var{vals} are assumed to be valid Calc objects, and
  632. are not evaluated or renormalized in any way.  If @var{vals} is an
  633. empty list, nothing happens.@refill
  634. X
  635. The stack elements are pushed without any sub-formula selections.
  636. You can give an optional third argument to this function, which must
  637. be a list the same size as @var{vals} of selections.  Each selection
  638. must be @code{eq} to some sub-formula of the corresponding formula
  639. in @var{vals}, or @code{nil} if that formula should have no selection.
  640. @end defun
  641. X
  642. @defun calc-top-list n m
  643. Return a list of the @var{n} objects starting at level @var{m} of the
  644. stack.  If @var{m} is omitted it defaults to 1, so that the elements are
  645. taken from the top of the stack.  If @var{n} is omitted, it also
  646. defaults to 1, so that the top stack element (in the form of a
  647. one-element list) is returned.  If @var{m} is greater than 1, the
  648. @var{m}th stack element will be at the end of the list, the @var{m}+1st
  649. element will be next-to-last, etc.  If @var{n} or @var{m} are out of
  650. range, the command is aborted with a suitable error message.  If @var{n}
  651. is zero, the function returns an empty list.  The stack elements are not
  652. evaluated or renormalized.@refill
  653. X
  654. If any stack elements contain selections, and selections have not
  655. been disabled by the @kbd{j e} (@code{calc-enable-selections}) command,
  656. this function returns the selection portions rather than the entire
  657. stack elements.  It can be given a third ``selection-mode'' argument
  658. which selection other behaviors.  If it is the symbol @code{t}, then
  659. a selection in any of the requested stack elements produces an
  660. ``illegal operation on selections'' error.  If it the symbol @code{full},
  661. the whole stack entry is always returned regardless of selections.
  662. If is the symbol @code{sel}, the selected portion is always returned,
  663. or @code{nil} if there is no selection.  (This mode ignores the @kbd{j e}
  664. command.)  If the symbol is @code{entry}, the complete stack entry in
  665. list form is returned; the first element of this list will be the whole
  666. formula, and the third element will be the selection (or @code{nil}).
  667. @end defun
  668. X
  669. @defun calc-pop-stack n m
  670. Remove the specified elements from the stack.  The parameters @var{n}
  671. and @var{m} are defined the same as for @code{calc-top-list}.  The return
  672. value of @code{calc-pop-stack} is uninteresting.
  673. X
  674. If there are any selected sub-formulas among the popped elements, and
  675. @kbd{j e} has not been used to disable selections, this produces an
  676. error without changing the stack.  If you supply an optional third
  677. argument of @code{t}, the stack elements are popped even if they
  678. contain selections.
  679. @end defun
  680. X
  681. @defun calc-record-list vals tag
  682. This function records one or more results in the trail.  The @var{vals}
  683. are a list of strings or Calc objects.  The @var{tag} is the four-character
  684. tag string to identify the values.  If @var{tag} is omitted, a blank tag
  685. will be used.
  686. @end defun
  687. X
  688. @defun calc-normalize n
  689. This function takes a Calc object and ``normalizes'' it.  At the very
  690. least this involves re-rounding floating-point values according to the
  691. current precision and other similar jobs.  Also, unless the user has
  692. selected no-simplify mode (@pxref{Simplification Modes}), this involves
  693. actually evaluating a formula object by executing the function calls
  694. it contains.
  695. @end defun
  696. X
  697. @defun calc-top-list-n n m
  698. This function is identical to @code{calc-top-list}, except that it calls
  699. @code{calc-normalize} on the values that it takes from the stack.  They
  700. are also passed through @code{check-complete}, so that incomplete
  701. objects will be rejected with an error message.  All computational
  702. commands should use this in preference to @code{calc-top-list}; the only
  703. standard Calc commands that operate on the stack without normalizing
  704. are stack management commands like @code{calc-enter} and @code{calc-roll-up}.
  705. This function accepts the same optional selection-mode argument as
  706. @code{calc-top-list}.
  707. @end defun
  708. X
  709. @defun calc-top-n m
  710. This function is a convenient form of @code{calc-top-list-n} in which only
  711. a single element of the stack is taken and returned, rather than a list
  712. of elements.  This also accepts an optional selection-mode argument.
  713. @end defun
  714. X
  715. @defun calc-enter-result n tag vals
  716. This function is a convenient interface to most of the above functions.
  717. The @var{vals} argument should be either a single Calc object, or a list
  718. of Calc objects; the object or objects are normalized, and the top @var{n}
  719. stack entries are replaced by the normalized objects.  If @var{tag} is
  720. non-@code{nil}, the normalized objects are also recorded in the trail.
  721. A typical stack-based computational command would take the form,
  722. X
  723. @smallexample
  724. (calc-enter-result @var{n} @var{tag} (cons 'calcFunc-@var{func}
  725. X                               (calc-top-list-n @var{n})))
  726. @end smallexample
  727. X
  728. If any of the @var{n} stack elements replaced contain sub-formula
  729. selections, and selections have not been disabled by @kbd{j e},
  730. this function takes one of two courses of action.  If @var{n} is
  731. equal to the number of elements in @var{vals}, then each element of
  732. @var{vals} is spliced into the corresponding selection; this is what
  733. happens when you use the @key{TAB} key, or when you use a unary
  734. arithmetic operation like @code{sqrt}.  If @var{vals} has only one
  735. element but @var{n} is greater than one, there must be only one
  736. selection among the top @var{n} stack elements; the element from
  737. @var{vals} is spliced into that selection.  This is what happens when
  738. you use a binary arithmetic operation like @kbd{+}.  Any other
  739. combination of @var{n} and @var{vals} when selections are present
  740. is an error.
  741. @end defun
  742. X
  743. @defun calc-unary-op tag func arg
  744. This function implements a unary operator that allows a numeric prefix
  745. argument to apply the operator over many stack entries.  If the prefix
  746. argument @var{arg} is @code{nil}, this uses @code{calc-enter-result}
  747. as outlined above.  Otherwise, it maps the function over several stack
  748. elements; @pxref{Prefix Arguments}.  For example,@refill
  749. X
  750. @smallexample
  751. (defun calc-zeta (arg)
  752. X  (interactive "P")
  753. X  (calc-unary-op "zeta" 'calcFunc-zeta arg))
  754. @end smallexample
  755. @end defun
  756. X
  757. @defun calc-binary-op tag func arg ident unary
  758. This function implements a binary operator, analogously to
  759. @code{calc-unary-op}.  The optional @var{ident} and @var{unary}
  760. arguments specify the behavior when the prefix argument is zero or
  761. one, respectively.  If the argument is zero, the value @var{ident}
  762. is pushed onto the stack, if specified, otherwise an error message
  763. is displayed.  If the argument is one, the unary function @var{unary}
  764. is applied to the top stack element, or, if @var{unary} is not
  765. specified, nothing happens.  When the argument is two or more,
  766. the binary function @var{func} is reduced across the top @var{arg}
  767. stack elements; when the argument is negative, the function is
  768. mapped between the next-to-top -@var{arg} stack elements and the
  769. top element.@refill
  770. @end defun
  771. X
  772. @defun calc-stack-size
  773. Return the number of elements on the stack as an integer.  This count
  774. does not include elements that have been temporarily hidden by stack
  775. truncation; @pxref{Truncating the Stack}.
  776. @end defun
  777. X
  778. @defun calc-cursor-stack-index n
  779. Move the point to the @var{n}th stack entry.  If @var{n} is zero, this
  780. will be the @samp{.} line.  If @var{n} is from 1 to the current stack size,
  781. this will be the beginning of the first line of that stack entry's display.
  782. If line numbers are enabled, this will move to the first character of the
  783. line number, not the stack entry itself.@refill
  784. @end defun
  785. X
  786. @defun calc-substack-height n
  787. Return the number of lines between the beginning of the @var{n}th stack
  788. entry and the bottom of the buffer.  If @var{n} is zero, this
  789. will be one (assuming no stack truncation).  If all stack entries are
  790. one line long (i.e., no matrices are displayed), the return value will
  791. be equal @var{n}+1 as long as @var{n} is in range.@refill
  792. @end defun
  793. X
  794. @defun calc-refresh
  795. Erase the @code{*Calculator*} buffer and reformat its contents from memory.
  796. This must be called after changing any parameter, such as the current
  797. display radix, which might change the appearance of existing stack
  798. entries.  (During a keyboard macro invoked by the @kbd{X} key, refreshing
  799. is suppressed, but a flag is set so that the entire stack will be refreshed
  800. rather than just the top few elements when the macro finishes.)@refill
  801. @end defun
  802. X
  803. @node Predicates, Computational Lisp Functions, Stack Lisp Functions, Internals
  804. @subsubsection Predicates
  805. X
  806. @noindent
  807. The functions described here are predicates, that is, they return a
  808. true/false value where @code{nil} means false and anything else means
  809. true.  These predicates are expanded by @code{defmath}, for example,
  810. from @code{zerop} to @code{math-zerop}.  In many cases they correspond
  811. to native Lisp functions by the same name, but are extended to cover
  812. the full range of Calc data types.
  813. X
  814. @defun zerop x
  815. Returns true if @var{x} is numerically zero, in any of the Calc data
  816. types.  (Note that for some types, such as error forms and intervals,
  817. it never makes sense to return true.)  In @code{defmath}, the expression
  818. @samp{(= x 0)} will automatically be converted to @samp{(math-zerop x)},
  819. and @samp{(/= x 0)} will be converted to @samp{(not (math-zerop x))}.
  820. @end defun
  821. X
  822. @defun negp x
  823. Returns true if @var{x} is negative.  This accepts negative real numbers
  824. of various types, negative HMS and date forms, and intervals in which
  825. all included values are negative.  In @code{defmath}, the expression
  826. @samp{(< x 0)} will automatically be converted to @samp{(math-negp x)},
  827. and @samp{(>= x 0)} will be converted to @samp{(not (math-negp x))}.
  828. @end defun
  829. X
  830. @defun posp x
  831. Returns true if @var{x} is positive (and non-zero).
  832. @end defun
  833. X
  834. @defun looks-negp x
  835. Returns true if @var{x} is ``negative-looking.''  This returns true if
  836. @var{x} is a negative number, or a formula with a leading minus sign
  837. such as @samp{-a/b}.  In other words, this is an object which can be
  838. made simpler by calling @code{(- @var{x})}.
  839. @end defun
  840. X
  841. @defun integerp x
  842. Returns true if @var{x} is an integer of any size.
  843. @end defun
  844. X
  845. @defun fixnump x
  846. Returns true if @var{x} is a native Lisp integer.
  847. @end defun
  848. X
  849. @defun natnump x
  850. Returns true if @var{x} is a nonnegative integer of any size.
  851. @end defun
  852. X
  853. @defun fixnatnump x
  854. Returns true if @var{x} is a nonnegative Lisp integer.
  855. @end defun
  856. X
  857. @defun num-integerp x
  858. Returns true if @var{x} is numerically an integer, i.e., either a
  859. true integer or a float with no significant digits to the right of
  860. the decimal point.
  861. @end defun
  862. X
  863. @defun messy-integerp x
  864. Returns true if @var{x} is numerically, but not literally, an integer.
  865. A value is @code{num-integerp} if it is @code{integerp} or
  866. @code{messy-integerp} (but it is never both at once).
  867. @end defun
  868. X
  869. @defun num-natnump x
  870. Returns true if @var{x} is numerically a nonnegative integer.
  871. @end defun
  872. X
  873. @defun evenp x
  874. Returns true if @var{x} is an even integer.
  875. @end defun
  876. X
  877. @defun looks-evenp x
  878. Returns true if @var{x} is an even integer, or a formula with a leading
  879. multiplicative coefficient which is an even integer.
  880. @end defun
  881. X
  882. @defun oddp x
  883. Returns true if @var{x} is an odd integer.
  884. @end defun
  885. X
  886. @defun provably-integerp x
  887. Returns true if @var{x} is an integer, or a formula whose result
  888. is guaranteed to be an integer (such as a call to @code{floor}).
  889. @end defun
  890. X
  891. @defun ratp x
  892. Returns true if @var{x} is a rational number, i.e., an integer or a
  893. fraction.
  894. @end defun
  895. X
  896. @defun realp x
  897. Returns true if @var{x} is a real number, i.e., an integer, fraction,
  898. or floating-point number.
  899. @end defun
  900. X
  901. @defun provably-realp x
  902. Returns true if @var{x} is a real number, or a formula whose result
  903. is guaranteed to be real (such as a call to @code{abs}).
  904. @end defun
  905. X
  906. @defun anglep x
  907. Returns true if @var{x} is a real number or HMS form.
  908. @end defun
  909. X
  910. @defun floatp x
  911. Returns true if @var{x} is a float, or a complex number, error form,
  912. interval, date form, or modulo form in which at least one component
  913. is a float.
  914. @end defun
  915. X
  916. @defun complexp x
  917. Returns true if @var{x} is a rectangular or polar complex number
  918. (but not a real number).
  919. @end defun
  920. X
  921. @defun rect-complexp x
  922. Returns true if @var{x} is a rectangular complex number.
  923. @end defun
  924. X
  925. @defun polar-complexp x
  926. Returns true if @var{x} is a polar complex number.
  927. @end defun
  928. X
  929. @defun numberp x
  930. Returns true if @var{x} is a real number or a complex number.
  931. @end defun
  932. X
  933. @defun scalarp x
  934. Returns true if @var{x} is a real or complex number or an HMS form.
  935. @end defun
  936. X
  937. @defun vectorp x
  938. Returns true if @var{x} is a vector (this simply checks if its argument
  939. is a list whose first element is the symbol @code{vec}).
  940. @end defun
  941. X
  942. @defun numvecp x
  943. Returns true if @var{x} is a number or vector.
  944. @end defun
  945. X
  946. @defun matrixp x
  947. Returns true if @var{x} is a matrix, i.e., a vector of one or more vectors,
  948. all of the same size.
  949. @end defun
  950. X
  951. @defun square-matrixp x
  952. Returns true if @var{x} is a square matrix.
  953. @end defun
  954. X
  955. @defun objectp x
  956. Returns true if @var{x} is any numeric Calc object, including real and
  957. complex numbers, HMS forms, date forms, error forms, intervals, and
  958. modulo forms.  (Note that error forms and intervals may include formulas
  959. as their components; see @code{constp} below.)
  960. @end defun
  961. X
  962. @defun objvecp x
  963. Returns true if @var{x} is an object or a vector.  This also accepts
  964. incomplete objects, but it rejects variables and formulas (except as
  965. mentioned above for @code{objectp}).
  966. @end defun
  967. X
  968. @defun primp x
  969. Returns true if @var{x} is a ``primitive'' or ``atomic'' Calc object,
  970. i.e., one whose components cannot be regarded as sub-formulas.  This
  971. includes variables, and all @code{objectp} types except error forms
  972. and intervals.
  973. @end defun
  974. X
  975. @defun constp x
  976. Returns true if @var{x} is constant, i.e., a real or complex number,
  977. HMS form, date form, or error form, interval, or vector all of whose
  978. components are @code{constp}.
  979. @end defun
  980. X
  981. @defun lessp x y
  982. Returns true if @var{x} is numerically less than @var{y}.  Returns false
  983. if @var{x} is greater than or equal to @var{y}, or if the order is
  984. undefined or cannot be determined.  Generally speaking, this works
  985. by checking whether @samp{@var{x} - @var{y}} is @code{negp}.  In
  986. @code{defmath}, the expression @samp{(< x y)} will automatically be
  987. converted to @samp{(lessp x y)}; expressions involving @code{>}, @code{<=},
  988. and @code{>=} are similarly converted in terms of @code{lessp}.@refill
  989. @end defun
  990. X
  991. @defun beforep x y
  992. Returns true if @var{x} comes before @var{y} in a canonical ordering
  993. of Calc objects.  If @var{x} and @var{y} are both real numbers, this
  994. will be the same as @code{lessp}.  But whereas @code{lessp} considers
  995. other types of objects to be unordered, @code{beforep} puts any two
  996. objects into a definite, consistent order.  One application of
  997. @code{beforep} is that algebraic simplification rearranges the terms
  998. in a product into canonical order, so that @samp{x y + y x} can
  999. cheaply be simplified to @samp{2 x y}.
  1000. @end defun
  1001. X
  1002. @defun equal x y
  1003. This is the standard Lisp @code{equal} predicate; it returns true if
  1004. @var{x} and @var{y} are structurally identical.  This is the usual way
  1005. to compare numbers for equality, but note that @code{equal} will treat
  1006. 0 and 0.0 as different.
  1007. @end defun
  1008. X
  1009. @defun math-equal x y
  1010. Returns true if @var{x} and @var{y} are numerically equal, either because
  1011. they are @code{equal}, or because their difference is @code{zerop}.  In
  1012. @code{defmath}, the expression @samp{(= x y)} will automatically be
  1013. converted to @samp{(math-equal x y)}.
  1014. @end defun
  1015. X
  1016. @defun equal-int x n
  1017. Returns true if @var{x} and @var{n} are numerically equal, where @var{n}
  1018. is a fixnum which is not a multiple of 10.  This will automatically be
  1019. used by @code{defmath} in place of the more general @code{math-equal}
  1020. whenever possible.@refill
  1021. @end defun
  1022. X
  1023. @defun nearly-equal x y
  1024. Returns true if @var{x} and @var{y}, as floating-point numbers, are
  1025. equal except possibly in the last decimal place.  For example,
  1026. 314.159 and 314.166 are considered nearly equal if the current
  1027. precision is 6 (since they differ by 7 units), but not if the current
  1028. precision is 7 (since they differ by 70 units).  Most functions which
  1029. use series expansions use @code{with-extra-prec} to evaluate the
  1030. series with 2 extra digits of precision, then use @code{nearly-equal}
  1031. to decide when the series has converged; this guards against cumulative
  1032. error in the series evaluation without doing extra work which would be
  1033. lost when the result is rounded back down to the current precision.
  1034. In @code{defmath}, this can be written @samp{(~= @var{x} @var{y})}.
  1035. The @var{x} and @var{y} can be numbers of any kind, including complex.
  1036. @end defun
  1037. X
  1038. @defun nearly-zerop x y
  1039. Returns true if @var{x} is nearly zero, compared to @var{y}.  This
  1040. checks whether @var{x} plus @var{y} would by be @code{nearly-equal}
  1041. to @var{y} itself, to within the current precision, in other words,
  1042. if adding @var{x} to @var{y} would have a negligible effect on @var{y}
  1043. due to roundoff error.  @var{X} may be a real or complex number, but
  1044. @var{y} must be real.
  1045. @end defun
  1046. X
  1047. @defun is-true x
  1048. Return true if the formula @var{x} represents a true value in
  1049. Calc, not Lisp, terms.  It tests if @var{x} is a non-zero number.
  1050. @end defun
  1051. X
  1052. @defun reject-arg val pred
  1053. Abort the current function evaluation due to unacceptable argument values.
  1054. This calls @samp{(calc-record-why @var{pred} @var{val})}, then signals a
  1055. Lisp error which @code{normalize} will trap.  The net effect is that the
  1056. function call which led here will be left in symbolic form.@refill
  1057. @end defun
  1058. X
  1059. @defun inexact-value
  1060. If Symbolic Mode is enabled, this will signal an error that causes
  1061. @code{normalize} to leave the formula in symbolic form, with the message
  1062. ``Inexact result.''  (This function has no effect when not in Symbolic Mode.)
  1063. Note that if your function calls @samp{(sin 5)} in Symbolic Mode, the
  1064. @code{sin} function will call @code{inexact-value}, which will cause your
  1065. function to be left unsimplified.  You may instead wish to call
  1066. @samp{(normalize (list 'calcFunc-sin 5))}, which in Symbolic Mode will
  1067. return the formula @samp{sin(5)} to your function.@refill
  1068. @end defun
  1069. X
  1070. @node Computational Lisp Functions, Vector Lisp Functions, Predicates, Internals
  1071. @subsubsection Computational Functions
  1072. X
  1073. @noindent
  1074. The functions described here do the actual computational work of the
  1075. Calculator.  In addition to these, note that any function described in
  1076. the main body of this manual may be called from Lisp; for example, if
  1077. the documentation refers to the @code{calc-sqrt} [@code{sqrt}] command,
  1078. this means @code{calc-sqrt} is an interactive stack-based square-root
  1079. command and @code{sqrt} (which @code{defmath} expands to @code{calcFunc-sqrt})
  1080. is the actual Lisp function for taking square roots.@refill
  1081. X
  1082. The functions @code{math-add}, @code{math-sub}, @code{math-mul},
  1083. @code{math-div}, @code{math-mod}, and @code{math-neg} are not included
  1084. in this list, since @code{defmath} allows you to write native Lisp
  1085. @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, and unary @code{-},
  1086. respectively, instead.@refill
  1087. X
  1088. @defun normalize val
  1089. (Full form: @code{math-normalize}.)
  1090. Reduce the value @var{val} to standard form.  For example, if @var{val}
  1091. is a fixnum, it will be converted to a bignum if it is too large, and
  1092. if @var{val} is a bignum it will be normalized by clipping off trailing
  1093. (i.e., most-significant) zero digits and converting to a fixnum if it is
  1094. small.  All the various data types are similarly converted to their standard
  1095. forms.  Variables are left alone, but function calls are actually evaluated
  1096. in formulas.  For example, normalizing @samp{(+ 2 (calcFunc-abs -4))} will
  1097. return 6.@refill
  1098. X
  1099. If a function call fails, because the function is void or has the wrong
  1100. number of parameters, or because it returns @code{nil} or calls
  1101. @code{reject-arg} or @code{inexact-result}, @code{normalize} returns
  1102. the formula still in symbolic form.@refill
  1103. X
  1104. If the current Simplification Mode is ``none'' or ``numeric arguments
  1105. only,'' function calls may not be normalized.  However, the more
  1106. powerful simplification modes (like algebraic simplification) are
  1107. not handled by @code{normalize}.  They are handled by @code{calc-normalize},
  1108. which calls @code{normalize} and possibly some other routines, such
  1109. as @code{simplify} or @code{simplify-units}.  Programs should never
  1110. call @code{calc-normalize} except when popping or pushing values on
  1111. the stack.@refill
  1112. @end defun
  1113. X
  1114. @defun evaluate-expr expr
  1115. Replace all variables in @var{expr} that have values with their values,
  1116. then use @code{normalize} to simplify the result.  This is what happens
  1117. when you press the @kbd{=} key interactively.@refill
  1118. @end defun
  1119. X
  1120. @defmac with-extra-prec n body
  1121. Evaluate the Lisp forms in @var{body} with precision increased by @var{n}
  1122. digits.  This is a macro which expands to
  1123. X
  1124. @smallexample
  1125. (math-normalize
  1126. X  (let ((calc-internal-prec (+ calc-internal-prec @var{n})))
  1127. X    @var{body}))
  1128. @end smallexample
  1129. X
  1130. The surrounding call to @code{math-normalize} causes a floating-point
  1131. result to be rounded down to the original precision afterwards.  This
  1132. is important because some arithmetic operations assume a number's
  1133. mantissa contains no more digits than the current precision allows.
  1134. @end defmac
  1135. X
  1136. @defun make-frac n d
  1137. Build a fraction @samp{@var{n}:@var{d}}.  This is equivalent to calling
  1138. @samp{(normalize (list 'frac @var{n} @var{d}))}, but more efficient.
  1139. @end defun
  1140. X
  1141. @defun make-float mant exp
  1142. Build a floating-point value out of @var{mant} and @var{exp}.
  1143. @end defun
  1144. X
  1145. @defun make-sdev x sigma
  1146. Build an error form out of @var{x} and the absolute value of @var{sigma}.
  1147. If @var{sigma} is zero, the result is the number @var{x} directly.
  1148. If @var{sigma} is negative or complex, its absolute value is used.
  1149. If @var{x} or @var{sigma} is not a valid type of object for use in
  1150. error forms, this calls @code{reject-arg}.
  1151. @end defun
  1152. X
  1153. @defun make-intv mask lo hi
  1154. Build an interval form out of @var{mask} (which is assumed to be an
  1155. integer from 0 to 3), and the limits @var{lo} and @var{hi}.  If
  1156. @var{lo} is greater than @var{hi}, an empty interval form is returned.
  1157. This calls @code{reject-arg} if @var{lo} or @var{hi} is unsuitable.
  1158. @end defun
  1159. X
  1160. @defun sort-intv mask lo hi
  1161. Build an interval form, similar to @code{make-intv}, except that if
  1162. @var{lo} is less than @var{hi} they are simply exchanged, and the
  1163. bits of @var{mask} are swapped accordingly.
  1164. @end defun
  1165. X
  1166. @defun make-mod n m
  1167. Build a modulo form out of @var{n} and the modulus @var{m}.  Since modulo
  1168. forms do not allow formulas as their components, if @var{n} or @var{m}
  1169. is not a real number or HMS form the result will be a formula which
  1170. is a call to @code{makemod}, the algebraic version of this function.
  1171. @end defun
  1172. X
  1173. @defun float x
  1174. Convert @var{x} to floating-point form.  Integers and fractions are
  1175. converted to numerically equivalent floats; components of complex
  1176. numbers, vectors, HMS forms, date forms, error forms, intervals, and
  1177. modulo forms are recursively floated.  If the argument is a variable
  1178. or formula, this calls @code{reject-arg}.
  1179. @end defun
  1180. X
  1181. @defun compare x y
  1182. Compare the numbers @var{x} and @var{y}, and return @i{-1} if
  1183. @samp{(lessp @var{x} @var{y})}, 1 if @samp{(lessp @var{y} @var{x})},
  1184. 0 if @samp{(math-equal @var{x} @var{y})}, or 2 if the order is
  1185. undefined or cannot be determined.@refill
  1186. @end defun
  1187. X
  1188. @defun numdigs n
  1189. Return the number of digits of integer @var{n}, effectively
  1190. @samp{ceil(log10(@var{n}))}, but much more efficient.  Zero is
  1191. considered to have zero digits.
  1192. @end defun
  1193. X
  1194. @defun scale-int x n
  1195. Shift integer @var{x} left @var{n} digits, or right -@var{n} digits
  1196. with truncation toward zero.
  1197. @end defun
  1198. X
  1199. @defun scale-rounding x n
  1200. Like @code{scale-int}, except that a right shift rounds to the nearest
  1201. integer rather than truncating.
  1202. @end defun
  1203. X
  1204. @defun fixnum n
  1205. Return the integer @var{n} as a fixnum, i.e., a native Lisp integer.
  1206. If @var{n} is outside the permissible range for Lisp integers (usually
  1207. 24 binary bits) the result is undefined.
  1208. @end defun
  1209. X
  1210. @defun sqr x
  1211. Compute the square of @var{x}; short for @samp{(^ @var{x} 2)}.
  1212. @end defun
  1213. X
  1214. @defun quotient x y
  1215. Divide integer @var{x} by integer @var{y}; return an integer quotient
  1216. and discard the remainder.  If @var{x} or @var{y} is negative, the
  1217. direction of rounding is undefined.
  1218. @end defun
  1219. X
  1220. @defun idiv x y
  1221. Perform an integer division; if @var{x} and @var{y} are both nonnegative
  1222. integers, this uses the @code{quotient} function, otherwise it computes
  1223. @samp{floor(@var{x}/@var{y})}.  Thus the result is well-defined but
  1224. slower than for @code{quotient}.
  1225. @end defun
  1226. X
  1227. @defun imod x y
  1228. Divide integer @var{x} by integer @var{y}; return the integer remainder
  1229. and discard the quotient.  Like @code{quotient}, this works only for
  1230. integer arguments and is not well-defined for negative arguments.
  1231. For a more well-defined result, use @samp{(% @var{x} @var{y})}.
  1232. @end defun
  1233. X
  1234. @defun idivmod x y
  1235. Divide integer @var{x} by integer @var{y}; return a cons cell whose
  1236. @code{car} is @samp{(quotient @var{x} @var{y})} and whose @code{cdr}
  1237. is @samp{(imod @var{x} @var{y})}.@refill
  1238. @end defun
  1239. X
  1240. @defun pow x y
  1241. Compute @var{x} to the power @var{y}.  In @code{defmath}, this can also
  1242. be written @samp{(^ @var{x} @var{y})} or @samp{(expt @var{x} @var{y})}.
  1243. @end defun
  1244. X
  1245. @defun abs-approx x
  1246. Compute a fast approximation to the absolute value of @var{x}.  For
  1247. example, for a rectangular complex number the result is the sum of
  1248. the absolute values of the components.
  1249. @end defun
  1250. X
  1251. @findex two-pi
  1252. @findex pi-over-2
  1253. @findex pi-over-4
  1254. @findex pi-over-180
  1255. @findex sqrt-two-pi
  1256. @findex sqrt-e
  1257. @findex e
  1258. @findex ln-2
  1259. @findex ln-10
  1260. @defun pi
  1261. The function @samp{(pi)} computes @samp{pi} to the current precision.
  1262. Other related constant-generating functions are @code{two-pi},
  1263. @code{pi-over-2}, @code{pi-over-4}, @code{pi-over-180}, @code{sqrt-two-pi},
  1264. @code{e}, @code{sqrt-e}, @code{ln-2}, and @code{ln-10}.  Each function
  1265. returns a floating-point value in the current precision, and each uses
  1266. caching so that all calls after the first are essentially free.@refill
  1267. @end defun
  1268. X
  1269. @defmac math-defcache @var{func} @var{initial} @var{form}
  1270. This macro, usually used as a top-level call like @code{defun} or
  1271. @code{defvar}, defines a new cached constant analogous to @code{pi}, etc.
  1272. It defines a function @code{func} which returns the requested value;
  1273. if @var{initial} is non-@code{nil} it must be a @samp{(float @dots{})}
  1274. form which serves as an initial value for the cache.  If @var{func}
  1275. is called when the cache is empty or does not have enough digits to
  1276. satisfy the current precision, the Lisp expression @var{form} is evaluated
  1277. with the current precision increased by four, and the result minus its
  1278. two least significant digits is stored in the cache.  For example,
  1279. calling @samp{(pi)} with a precision of 30 computes @samp{pi} to 34
  1280. digits, rounds it down to 32 digits for future use, then rounds it
  1281. again to 30 digits for use in the present request.@refill
  1282. @end defmac
  1283. X
  1284. @findex half-circle
  1285. @findex quarter-circle
  1286. @defun full-circle symb
  1287. If the current angular mode is Degrees or HMS, this function returns the
  1288. integer 360.  In Radians mode, this function returns either the
  1289. corresponding value in radians to the current precision, or the formula
  1290. @samp{2*pi}, depending on the Symbolic Mode.  There are also similar
  1291. function @code{half-circle} and @code{quarter-circle}.
  1292. @end defun
  1293. X
  1294. @defun power-of-2 n
  1295. Compute two to the integer power @var{n}, as a (potentially very large)
  1296. integer.  Powers of two are cached, so only the first call for a
  1297. particular @var{n} is expensive.
  1298. @end defun
  1299. X
  1300. @defun integer-log2 n
  1301. Compute the base-2 logarithm of @var{n}, which must be an integer which
  1302. is a power of two.  If @var{n} is not a power of two, this function will
  1303. return @code{nil}.
  1304. @end defun
  1305. X
  1306. @defun div-mod a b m
  1307. Divide @var{a} by @var{b}, modulo @var{m}.  This returns @code{nil} if
  1308. there is no solution, or if any of the arguments are not integers.@refill
  1309. @end defun
  1310. X
  1311. @defun pow-mod a b m
  1312. Compute @var{a} to the power @var{b}, modulo @var{m}.  If @var{a},
  1313. @var{b}, and @var{m} are integers, this uses an especially efficient
  1314. algorithm.  Otherwise, it simply computes @samp{(% (^ a b) m)}.
  1315. @end defun
  1316. X
  1317. @defun isqrt n
  1318. Compute the integer square root of @var{n}.  This is the square root
  1319. of @var{n} rounded down toward zero, i.e., @samp{floor(sqrt(@var{n}))}.
  1320. If @var{n} is itself an integer, the computation is especially efficient.
  1321. @end defun
  1322. X
  1323. @defun to-hms a ang
  1324. Convert the argument @var{a} into an HMS form.  If @var{ang} is specified,
  1325. it is the angular mode in which to interpret @var{a}, either @samp{'deg}
  1326. or @samp{'rad}.  Otherwise, the current angular mode is used.  If @var{a}
  1327. is already an HMS form it is returned as-is.
  1328. @end defun
  1329. X
  1330. @defun from-hms a ang
  1331. SHAR_EOF
  1332. true || echo 'restore of calc.texinfo failed'
  1333. fi
  1334. echo 'End of  part 53'
  1335. echo 'File calc.texinfo is continued in part 54'
  1336. echo 54 > _shar_seq_.tmp
  1337. exit 0
  1338. exit 0 # Just in case...
  1339. -- 
  1340. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1341. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1342. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1343. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1344.